import javafx.scene.control.Labeled;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.LocalDateTime;

public class MyTest extends JFrame implements ActionListener {//继承JFrame
    private JPanel north, center;//定义一个面版
    private JTextField field;//定义文本框 用于显示结果
    private JButton[] btns;//定义按钮
    //按钮文字数组
    private String[] str;
    private ScriptEngine engine;//定义计算引擎

    public MyTest() {//构造函数
        initComponent();//初始化窗口
        setTitle("计算器");//设置标题
        setSize(700, 700);//设置大小
        setDefaultCloseOperation(EXIT_ON_CLOSE);///设置关闭窗口
        setLocation((int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth() - this.getWidth()) / 2,
                (int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight() - this.getHeight()) /2);//设置位置
        initComponent();//初始化窗口
        setVisible(true);//设置可见
    }

    private void initComponent() {//初始化窗口
        ScriptEngineManager manager =new ScriptEngineManager();
        engine = manager.getEngineByName("javascript");
        north = new JPanel();
        center = new JPanel();
        field = new JTextField();//创建文本框
        field.setPreferredSize(new Dimension(660, 80));//设置文本框的长度
        field.setEditable(false);//输入框禁止编辑
        field.setFont(new Font("SanSerif", Font.BOLD, 25));//设置字体
        str = new String[]{
                "sin", "cos", "1/x", "√",
                "7", "8", "9", "+",
                "4", "5", "6", "-",
                "1", "2", "3", "×",
                ".", "0", "=", "÷",
                "C", "B", "T", "S",
        };//定义按钮文字
        btns = new JButton[str.length];//创建按钮
        for (int i = 0; i < btns.length; i++) {
            btns[i] = new JButton(str[i]);//创建按钮
            btns[i].setFont(new Font("SanSerif", Font.BOLD, 25));//设置字体
        }

        north.setLayout(new FlowLayout());//设置布局
        center.setLayout(new GridLayout(6, 4));//设置布局
        north.add(field);//添加文本框
        for (int i = 0; i < btns.length; i++) {
            center.add(btns[i]);//添加按钮
        }
        this.add(north, BorderLayout.NORTH);//添加面版
        this.add(center);

        for (int i = 0; i < btns.length; i++) {//添加按钮监听器:按键被敲击时显示内容
            btns[i].addActionListener(this);
        }

    }

    public void showBtnText(String text) throws ScriptException {//添加按钮文字显示到文本框
//         System.out.println(text);
//         Boolean isNum=text.matches("\\d");//判断text是不是数字（用正则表达式检测text是不是单个数字） d 代表数字
//         if (isNum) {
//             //如果是数字，就拼接在字符串上
             String oldText = field.getText();//获取文本框的文字
//             field.setText(oldText + text);//拼接字符串
//         }else {
// //            //如果不是数字就特殊处理
// //            System.out.println("else");
// //            System.out.println(text);text
            if("C".equals(text)) {
                System.out.println("C");
                //清楚输入框
                field.setText("");
            }else if("B".equals(text)) {
                System.out.println("B");
                //删除最后一位
                if(field.getText().length()>0){
                    //先获取文本框的文字，然后截取掉最后一位，将截取后的字符串重新设置给文本框
                }
                field.setText(field.getText().substring(0,field.getText().length()-1));
            }else if("T".equals(text)) {
                System.out.println("T");
                //显示时间/ 显示实时时间
                    LocalDateTime now = LocalDateTime.now();
                    System.out.println("当前时间是: " + now);
                    field.setText(now+"");


            }else if("S".equals(text)) {
                System.out.println("S");
                //关闭时间
                field.setText("");
            }else if("sin".equals(text)) {
                System.out.println("sin");
                //三角函数
                //获得要计算的内容
                    try{
                    String txt=field.getText();
                    System.out.println(txt);
                    //使用计算引擎计算结果
                        Object o =engine.eval("Math.sin("+txt+")");
                    //计算输入框中的内容
                        System.out.println(o);
                        field.setText(o+"");//拼接字符串
                } catch (ScriptException e) {
                        throw new RuntimeException(e);
                    }
            }else if("cos".equals(text)) {
                System.out.println("cos");
                //三角函数
                //获得要计算的内容
                    try{
                    String txt=field.getText();
                    System.out.println(txt);
                    //使用计算引擎计算结果
                        Object o =engine.eval("Math.cos("+txt+")");
                    //计算输入框中的内容
                        System.out.println(o);
                        field.setText(o+"");//拼接字符串
                } catch (ScriptException e) {
                        throw new RuntimeException(e);
                    }

            }else if("1/x".equals(text)) {
                System.out.println("1/x");
                //除法
                //获得要计算的内容
                    try{
                    String txt=field.getText();//获取文本框的文字
                    System.out.println(txt);
                    //使用计算引擎计算结果
                        Object o =engine.eval("1/"+txt);
                    //计算输入框中的内容
                        System.out.println(o);
                        field.setText(o+"");//拼接字符串
                } catch (ScriptException e) {
                        throw new RuntimeException(e);
                    }

            }else if("√".equals(text)) {
                System.out.println("√");
                //开方
                //获得要计算的内容
                    try{
                    String txt=field.getText();
                    System.out.println(txt);
                    //使用计算引擎计算结果
                        Object o =engine.eval("Math.sqrt("+txt+")");
                    //计算输入框中的内容
                        System.out.println(o);
                        field.setText(o+"");//拼接字符串
                } catch (ScriptException e) {
                        throw new RuntimeException(e);
                    }
            }else if("=".equals(text)) {
                System.out.println("=");
                //获得要计算的内容
                    try{
                    String txt=field.getText();
                    System.out.println(txt);
                    txt=txt.replace("×","*").replaceAll("÷","/");//打印复制一次，不改变原始值
//                    ScriptEngineManager manager =new ScriptEngineManager();
//                    engine = manager.getEngineByName("javascript");
//                    //使用计算引擎计算结果
                        System.out.println(txt);
                    Object o =engine.eval(txt);
                    //计算输入框中的内容
                        System.out.println(o);
                        field.setText(o+"");//拼接字符串
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
            else{
                //数字、.、运算符 
                System.out.println("else");
                field.setText(oldText+text);
            }
//            //如果是运算符
//            //保留已输入的数字
//            String oldNum=field.getText();
//            System.out.println(oldNum);
//            //清空输入区
//            field.setText(text);
        }
        //field.setText(text);
//        String oldText = field.getText();//获取文本框的文字
//        field.setText(oldText + text);//拼接字符串




    @Override
    public void actionPerformed(ActionEvent e) {//重写方法
        //System.out.println(e.getSource());
        Object source = e.getSource();//获取按钮
        if (source instanceof JButton) {//判断按钮
            JButton btn = (JButton) source;//强制转换
            String text = btn.getText();//获取按钮文字
            //System.out.println(text);//打印按钮文字
            try {
                this.showBtnText(text);//展示到文本框
            } catch (ScriptException ex) {
                throw new RuntimeException(ex);
            }
        }
    }

    public static void main(String[] args) {
        System.out.println("Hello and welcome!");
        new MyTest();//创建对象
    }
}